
declare DivByZeroCheck

%% Tar et kalkulasjonstre, leter etter divisjoner og
%% sender nevneren til test i EvalAndCheck
fun {DivByZeroCheck Exp}
   case Exp of divide(A B) then
      {EvalAndCheck divide(A B)} orelse {DivByZeroCheck A}
   [] plus(A B) then
      {DivByZeroCheck A} orelse {DivByZeroCheck B}
   [] times(A B) then
      {DivByZeroCheck A} orelse {DivByZeroCheck B}
   [] minus(A B) then
      {DivByZeroCheck A} orelse {DivByZeroCheck B}
   else
      false
   end
end

%% Evaluerer uttrykk og skal returnere true om uttrykket blir null
fun {EvalAndCheck Exp}
   try
      {Eval Exp _}
      false
   catch X then
      true
   end
end

fun {Eval Exp}
   case Exp of plus(A B) then
      {Eval A} + {Eval B}
   [] minus(A B) then
      {Eval A} - {Eval B}
   [] times(A B) then
      {Eval A} * {Eval B}
   [] divide(A B) then
      BVal in
      BVal = {Eval B}
      if BVal == 0 then
	 raise error end
      end
      {Eval A} div BVal
   [] int(A) then
      A
   end
end

%declare Kalk Returned
%Kalk = divide(plus(int(1) int(2)) minus(int(1) int(1)))
%Returned = {DivByZeroCheck Kalk}
%{Browse Returned}